GEO 3/430 Group Project Resources

Active corridor and shared use mobility hub supporting information

Author

C. Scott Smith, PhD AICP (Instructor)

Published

January 20, 2024

Purpose

This document provides links to data and documents that may help inform course group projects.

Traffic Volumes

Annual Average Daily Traffic (AADT) is a measure of the amount of traffic on a given road or highway. It is calculated by taking the total number of vehicles that travel along a road or highway during a 24-hour period, and then dividing that number by 365 to get an average. AADT can be used to measure the amount of traffic on a road or highway over a long period of time and is a key indicator of road usage. There are a number of sources of traffic count information available to the public. Many are listed on the Chicago Metropolitan Association of Governments traffic data web page. Perhaps most useful for your group projects is the IDOT Statewide interactive Annual Average Daily Traffic Map. Enter a location or zoom in on map to see AADTs for most roadways in the state.

Traffic Crashes

The Chicago Data Portal has extensive and up-to-date crash data showing information about each traffic crash on city streets within the City of Chicago limits and under the jurisdiction of Chicago Police Department (CPD). According to the data portal, data are shown as is from the electronic crash reporting system (E-Crash) and suppresses any personally identifiable information. Records are added to the data portal when a crash report is finalized or when amendments are made to an existing report in E-Crash. A formatted version of the crash data for crashes occurring between 2015 through February 2023 are available via this link to a zipped shapefile (220MB) of crashes between 2015-2022 on the course GitHub repository. The data can be extracted and used in ArcGIS, QGIS, R or other programs that can import/display shapefiles.

Code
traffic_crashes <- read_csv("https://data.cityofchicago.org/api/views/85ca-t3if/rows.csv?accessType=DOWNLOAD")

traffic_crashes_formatted <- traffic_crashes %>%
  filter(CRASH_TYPE == "INJURY AND / OR TOW DUE TO CRASH") %>%
  mutate(date_time = as.POSIXct(CRASH_DATE, format = "%m/%d/%Y %H:%M:%S"),
         date = format(date_time, "%m/%d/%Y"),
         yearmonth = format(date_time, "%Y-%m"),
         year = format(date_time, "%Y")) %>%
  drop_na(LONGITUDE)
  
coordinates(traffic_crashes_formatted) = ~LONGITUDE+LATITUDE

traffic_crashes_sf <- traffic_crashes_formatted %>%
  st_as_sf() %>%
  st_set_crs(4326) %>%
  st_transform(3435)

# import city of chicago boundary
chicago_ca_boundary <- st_read("https://data.cityofchicago.org/api/geospatial/cauq-8yn6?method=export&format=GeoJSON") %>% 
  st_transform(3435) %>%
  select(community)

traffic_crashes_chicago_sf <- traffic_crashes_sf %>%
  st_join(chicago_ca_boundary) %>%
  drop_na(community)

traffic_crashes_chicago_sub_sf <- traffic_crashes_chicago_sf %>%
  select(community,
         speed_limit = POSTED_SPEED_LIMIT,
         weather = WEATHER_CONDITION,
         lighting = LIGHTING_CONDITION,
         roadway_type = TRAFFICWAY_TYPE,
         lanes = LANE_CNT,
         align = ALIGNMENT,
         surface_cond = ROADWAY_SURFACE_COND,
         intersect = INTERSECTION_RELATED_I,
         damage = DAMAGE,
         street = STREET_NO,
         street_dir = STREET_DIRECTION,
         street_name = STREET_NAME,
         inj_total = INJURIES_TOTAL,
         inf_fatal = INJURIES_FATAL,
         day = CRASH_DAY_OF_WEEK,
         hour = CRASH_HOUR,
         month = CRASH_MONTH,
         year,
         date,
         yearmonth)

# st_write(traffic_crashes_chicago_sub_sf, "layers/traffic_crashes_chicago_sub.shp", append=FALSE)

Commute Mode Share by Community Area, 2010-2020

Code
# join commute share attributes with community area geometries
modeshare_comty_area_2021_geom <- modeshare_comty_area_2010_2021 %>% 
  filter(year==2021) %>%
  mutate(pct_active = pct_bicycle+pct_walk) %>%
  left_join(chicago_comty_areas %>% select(-c(comarea_name)), by="comarea_id") %>%
  st_as_sf() %>%
  st_transform(crs=4326)

comty_area_labels <- sprintf(
  "Community Area: <strong>%s</strong><br/>
  Population: <strong>%s</strong><br/>
  Workers (16 and older): <strong>%s</strong><br/>
  Walk: %0.1f%%<br/>
  Bicycle: %0.1f%%<br/>
  Active:  %0.1f%%<br/>
  Transit: %0.1f%%<br/>
  Drove Alone: %0.1f%%<br/>
  Home: %0.1f%%",
  modeshare_comty_area_2021_geom$comarea_name,
  modeshare_comty_area_2021_geom$total_population,
  modeshare_comty_area_2021_geom$workers16pl,
  modeshare_comty_area_2021_geom$pct_walk,
  modeshare_comty_area_2021_geom$pct_bicycle,
  modeshare_comty_area_2021_geom$pct_active,
  modeshare_comty_area_2021_geom$pct_transit,
  modeshare_comty_area_2021_geom$pct_drovealone,
  modeshare_comty_area_2021_geom$pct_fromhome) %>%
lapply(htmltools::HTML)

# walk mode share
bins_walk <- c(0,1.6,2.7,4.5,31.6)
pal_walk <- colorBin("Blues", domain = modeshare_comty_area_2021_geom$pct_walk, bins = bins_walk)

walk_map <- leaflet(modeshare_comty_area_2021_geom) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
    fillColor = ~pal_walk(pct_walk),
    weight = 0.5,
    opacity = 1,
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    label = comty_area_labels) %>%
  addLegend("bottomleft", pal = pal_walk, values = ~pct_walk,
    title = "Walk Mode Share",
    labFormat = labelFormat(suffix = "%"),
    opacity = 1
  )

# bicycle mode share
bins_bicycle <- c(0,0.1,0.4,1.5,6.5)
pal_bicycle <- colorBin("Reds", domain = modeshare_comty_area_2021_geom$pct_bicycle, bins = bins_bicycle)

bicycle_map <- leaflet(modeshare_comty_area_2021_geom) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
    fillColor = ~pal_bicycle(pct_bicycle),
    weight = 0.5,
    opacity = 1,
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    label = comty_area_labels) %>%
  addLegend("bottomleft", pal = pal_bicycle, values = ~pct_bicycle,
    title = "Bicycle Mode Share",
    labFormat = labelFormat(suffix = "%"),
    opacity = 1
  )

# active mode share
bins_active <- c(0,1.8,2.9,6.1,32.7)
pal_active <- colorBin("Purples", domain = modeshare_comty_area_2021_geom$pct_active, bins = bins_active)

active_map <- leaflet(modeshare_comty_area_2021_geom) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
    fillColor = ~pal_active(pct_active),
    weight = 0.5,
    opacity = 1,
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    label = comty_area_labels) %>%
  addLegend("bottomleft", pal = pal_active, values = ~pct_active,
    title = "Active Mode Share",
    labFormat = labelFormat(suffix = "%"),
    opacity = 1
  )

# transit mode share
bins_transit <- c(4.8,15.0,21.2,27.2,40.6)
pal_transit <- colorBin("Greens", domain = modeshare_comty_area_2021_geom$pct_transit, bins = bins_transit)

transit_map <- leaflet(modeshare_comty_area_2021_geom) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
    fillColor = ~pal_transit(pct_transit),
    weight = 0.5,
    opacity = 1,
    color = "white",
    dashArray = "3",
    fillOpacity = 0.7,
    label = comty_area_labels) %>%
  addLegend("bottomleft", pal = pal_transit, values = ~pct_transit,
    title = "Transit Mode Share",
    labFormat = labelFormat(suffix = "%"),
    opacity = 1
  )

walk_map

Percent of workers who walk to work (static map)

Code
bicycle_map

Percent of workers who bicycle to work (static map)

Code
active_map

Percent of workers who use active transportation (bike+walk) to work (static map)

Code
transit_map

Percent of workers who take public transit to work (static map)

Code
# Export maps to png using oceanis package
# export_png(walk_map, chemin = "maps", nomFichier = "walk_map")
# export_png(bicycle_map, chemin = "maps", nomFichier = "bicycle_map")
# export_png(transit_map, chemin = "maps", nomFichier = "transit_map")
# export_png(active_map, chemin = "maps", nomFichier = "active_map")

Percent of Workers Age 16 and Older by Means of Transportation to Work by Chicago Community Area, 2021

Design Guides, Planning and Reporting Resources

NACTO Design Guides

The National Association of City Transportation Officials (NACTO) has numerous design guides that may be useful for your corridor (and/or intersection) proposals as well as the configurations of your shared use mobility hub.

StreetMix Application

The Urban Mobility Alliance and Code for America created an open source and freely available Streetmix, a tool for designing and reconfiguring street infrastructure (e.g., lanes, sidewalks, bus stops) in numerous ways and scenarios.

City of Chicago Transportation Plans

Shared Use Mobility Center

The Shared Use Mobility Center is a leader in advocating for innovative forms of transportation planning. They make available shared use mobility research and related policies across the country. Access these resources via the organization’s publications and mobility learning center web pages.

Group Presentation and Report Guidance

Each group is asked to create a presentation (lasting about 10-15 minutes, delivered Wednesday, 3/8 during regular class time) and a report (8 double-spaced pages due by Friday, 3/17). At the very least, the presentation should include: (1) a title slide with names of group members; (2) introduction to the group’s study area, including a reference map and some background concerning its current transportation amenities and limitations; and (3) summary of resources that are being used/considered to inform sustainable urban transportation proposal and recommendations. Of course, if the group is far enough along, they could present details of the proposal/recommendations. One group member should submit the presentation and report (with names of ALL group members) to the respective submission folder on D2L.

Measuring Access (to hospitals from Cook County places, community areas)

Code
#activate packages
library(dplyr) # data wrangling with pipe syntax
library(httr) # tools for Working with URLs and HTTP
library(jsonlite) # managing JSON data 
library(tidyverse) # data wrangling
library(sf) # simple features geometry data
library(nngeo) # perform nearest neighbor analysis
library(scales) # used for rescaling data
library(data.table) # data wrangling
library(ggplot2) # needed for bivariate mapping
library(sp) # spatial data package
library(units) # manage measurement units

# download hospitals within Cook County

hospitals_cook_county <- st_read("https://services1.arcgis.com/Hp6G80Pky0om7QvQ/arcgis/rest/services/Hospital/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson") %>%
  filter(COUNTYFIPS=="17031") %>%
  select(-c(VAL_DATE,SOURCEDATE), NAME, TYPE) %>% 
  st_transform(3435)

# create novel Cook County geography

# import City of Chicago community areas (N=77) GEOJSON and transform to local projection for spatial analysis (epsg:3435)

community_areas <- st_read("https://metopio.blob.core.windows.net/lalage/atlas/3/shapes/communityareas.topo.json", quiet=TRUE) %>% 
  st_as_sf() %>% 
  st_set_crs(4326) %>% 
  st_transform(3435) %>% 
  rename(geoid = id) %>% 
  mutate(geoid= str_replace(geoid,"1714000-",""),
         location = "Chicago, IL",
         type = "community area")

# import places within suburban Cook County (N=125) and transform to local projection for spatial analysis (epsg:3435)

places_cook_county <- st_read("https://metopio.blob.core.windows.net/lalage/atlas/6/shapes/SCC-place.topo.json", quiet=TRUE) %>% 
  st_as_sf() %>% 
  st_set_crs(4326) %>% 
  st_transform(3435) %>% 
  rename(geoid = id) %>% 
  mutate(sqmi = as.numeric(st_area(geometry)) * 0.0000003861,
         location = "suburban Cook County",
         type = "municipality") %>% 
  filter(sqmi >= 4) %>% 
  select(-sqmi)

# create a novel geography in Cook County which combines both municipalities in suburban Cook County and communities areas in Chicago

novel_geo_cook <- places_cook_county %>% 
  bind_rows(community_areas) %>% 
  st_as_sf() %>% 
  st_make_valid()

# --container based approach--

# count hospitals per area unit
novel_geo_cook_hospitals <- novel_geo_cook %>%
  st_join(hospitals_cook_county %>% select(NAME, TYPE)) %>% 
  st_drop_geometry() %>%
  mutate(value = if_else(!is.na(NAME),1,0)) %>%
  group_by(geoid) %>%
  summarise(count = sum(value))

# join counts with geography
novel_geo_cook_hospitals_geo <- novel_geo_cook %>% 
  left_join(novel_geo_cook_hospitals, by="geoid") %>% 
  st_as_sf()

# plot map by count
plot(novel_geo_cook_hospitals_geo['count'])

# create histogram frequencies by count
ggplot(novel_geo_cook_hospitals, aes(x=count)) +
  geom_histogram() + 
  xlab("count") +
  ylab("frequency")


# -- distance-based approach --
# create origin-destination (od) matrix
od_matrix_distance <- st_distance(novel_geo_cook, hospitals_cook_county) %>%
  as.data.frame() %>%
  drop_units() %>%
  mutate_if(is.numeric, ~ . * 0.000621371) %>%
  bind_cols(novel_geo_cook_hospitals_geo %>% 
              st_drop_geometry() %>% 
              select(geoid)) %>%
  select(geoid,V1:V72)

# summarize origin-destination matrix
od_matrix_distance_sum <- od_matrix_distance %>%
  rowwise() %>%
  mutate(min = min(across(V1:V72)),
         max = max(across(V1:V72)),
         mean = mean(V1:V72),
         n_1mi = sum(across(V1:V72) <= 1),
         n_5mi = sum(across(V1:V72) <= 5),
         n_7mi = sum(across(V1:V72) <= 7.5),
         n_10mi = sum(across(V1:V72) <= 10)) %>%
  select(geoid, min:n_10mi)

# join origin-destination matrix with cook county geographies
novel_geo_cook_hospitals_od_geo <- novel_geo_cook_hospitals_geo %>% 
  left_join(od_matrix_distance_sum, by="geoid") %>% 
  st_as_sf()

# plot map by count
plot(novel_geo_cook_hospitals_od_geo['min'])

# create histogram frequencies by count
ggplot(od_matrix_distance_sum, aes(x=n_10mi)) +
  geom_histogram() + 
  xlab("count") +
  ylab("frequency")

Group Project Peer Review

Please use this survey link to provide an assessment of both your work and the work of each team member concerning their contribution to the group project.